package com.betterjr.modules.customer;

import java.lang.reflect.Field;
import java.util.Set;

import com.betterjr.common.entity.BetterjrEntity;
import com.betterjr.mapper.common.Mapper;
import com.betterjr.mapper.mapperhelper.EntityHelper;
import com.betterjr.mapper.mapperhelper.EntityHelper.EntityColumn;
import com.betterjr.modules.temhandler.dubbo.interfaces.AbstractTemDataHandlerAdapter;

/**
 * 
 * @ClassName: AbstractBaseMechCustTemDataHandlerAdapter 
 * @Description:  企业基础信息回调临时数据适配器（实现审核生效操作）
 * @author xuyp
 * @date 2018年1月9日 上午10:36:38 
 * 
 * @param <D>
 * @param <T>
 */
public abstract class AbstractBaseMechCustTemDataHandlerAdapter<D extends Mapper<T>, T extends BetterjrEntity>
        extends AbstractTemDataHandlerAdapter<D, T> {

    /**
     * 新增审批
     */
    private final static String TEM_OPER_TYPE_INSERT = "0";

    /**
     * 更新审批
     */
    private final static String TEM_OPER_TYPE_UPDATE = "1";

    /**
     * 删除审批
     */
    private final static String TEM_OPER_TYPE_DELETE = "2";

    @Override
    public void handlerEffective(T t) {
        if (t != null) {

            // 获取主键的值
            Object key = getFieldValue(getPrimaryKeyFieldName(t), t);

            // 获取处理标记的值 tmpOperType '0','新增' '1','修改' '2','删除'
            Object tmpOperType = getFieldValue("tmpOperType", t);

            T t2 = this.selectByPrimaryKey(key);
            if (t2 != null) {
                // 如果tmpOperType 为空 或者 tmpOperType =0 或者 tmpOperType=1 执行 新增或者删除操作
                if (tmpOperType == null || TEM_OPER_TYPE_INSERT.equals(tmpOperType.toString())
                        || TEM_OPER_TYPE_UPDATE.equals(tmpOperType.toString())) {
                    this.updateByPrimaryKeySelective(t);
                }

                // 如果 tmpOperType =2 执行删除操作
                if (TEM_OPER_TYPE_DELETE.equals(tmpOperType.toString())) {
                    this.deleteByPrimaryKey(key);
                }

            } else {
                this.insertSelective(t);
            }

        }
    }

    /**
     * 
     * @Title: getPrimaryKeyFieldName 
     * @Description: 获取主键的名称
     * @param t
     * @return 
     * @throws 
     * @author xuyp
     * @date 2018年1月9日 上午10:37:30
     */
    private String getPrimaryKeyFieldName(T t) {

        Set<EntityColumn> pkColumns = EntityHelper.getPKColumns(t.getClass());
        String primaryName = "id";
        for (EntityColumn entityColumn : pkColumns) {
            primaryName = entityColumn.getProperty();
        }

        return primaryName;
    }

    /**
     * 
     * @Title: getFieldValue 
     * @Description: 获取对象某个属性的值 
     * @param anFieldName
     * @param t
     * @return 
     * @throws 
     * @author xuyp
     * @date 2018年1月9日 上午10:38:13
     */
    private Object getFieldValue(String anFieldName, T t) {

        Field[] fields = t.getClass().getDeclaredFields();

        if (fields != null) {
            for (Field field : fields) {
                if (field.getName().equals(anFieldName)) {
                    field.setAccessible(true);
                    try {
                        return field.get(t);
                    }
                    catch (Exception e) {

                        e.printStackTrace();
                        return "";
                    }
                }

            }
        }

        return "";
    }
}
